public class ThreadDeadLock {
    public static void main(String[] args) {
        // 死锁的演示

        // 创建两个锁对象
        Object locker1 = new Object();
        Object locker2 = new Object();

        // 破解方法 ： 就是给这两个锁进行编号，约定先拿小号再拿大号


        // 给变量改名的快捷键是 shift+F6

        Thread thread1 = new Thread(()->{
            synchronized (locker1){

                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                synchronized (locker2){
                    // 线程一先对 locker1 加锁再对 locker2 加锁
                    System.out.println("线程一把两个锁都拿到了");
                }
            }
        });
        Thread thread2 = new Thread(()->{
        /*    synchronized (locker2){

                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                synchronized (locker1){
                    // 线程二先对 locker2 加锁再对 locker1 加锁
                    System.out.println("线程二把两个锁都拿到了");
                }
            }*/

            // 破解方法就是让这个线程的加锁也拿小号先
            synchronized (locker1){

                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                synchronized (locker2){
                    // 线程二先对 locker2 加锁再对 locker1 加锁
                    System.out.println("线程二把两个锁都拿到了");
                }
            }
        });  // 这样写等一段时间就会出现结果了

        // 这时候呢 这两个线程都没有执行到获取两把锁的情况
        // 运行结果里面没有任何日志，就说明出现两个线程相互阻塞的情况

        // 使用jconsole可以查看
        // 借助这个工具来定位锁的位置，看线程的状态和调用栈，就可以分析出代码是在哪里死锁了。
        thread1.start();
        thread2.start();
    }
}
